package com.notifier.filter;

import com.notifier.event.ErrorEvent;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * 频率限制过滤器
 * 职责：每分钟最多通过20条通知
 *
 * @author Amadeus
 * @date 2025/10/14
 */
@Slf4j
@Component
public class RateLimitFilter implements IErrorFilter {

    /**
     * 每分钟最大通知数
     */
    private static final int MAX_PER_MINUTE = 20;

    /**
     * 当前分钟的计数器
     */
    private static final AtomicInteger CURRENT_COUNT = new AtomicInteger(0);

    /**
     * 上次重置时间
     */
    private static volatile long LAST_RESET_TIME = System.currentTimeMillis();

    /**
     * 是否已发送达到上限的警告
     */
    private static volatile boolean LIMIT_WARNING_SENT = false;

    @Override
    public boolean shouldFilter(ErrorEvent event) {
        long currentTime = System.currentTimeMillis();

        // 每分钟重置一次计数器
        if (currentTime - LAST_RESET_TIME > 60_000) {
            synchronized (RateLimitFilter.class) {
                if (currentTime - LAST_RESET_TIME > 60_000) {
                    CURRENT_COUNT.set(0);
                    LAST_RESET_TIME = currentTime;
                    LIMIT_WARNING_SENT = false;
                    log.debug("频率限制计数器已重置");
                }
            }
        }

        int count = CURRENT_COUNT.get();
        if (count >= MAX_PER_MINUTE) {
            // 达到限制，只在达到上限时发送一次警告
            if (!LIMIT_WARNING_SENT) {
                synchronized (RateLimitFilter.class) {
                    if (!LIMIT_WARNING_SENT) {
                        log.warn("⚠️ 错误通知已达到本分钟上限（{}条），后续错误将被过滤", MAX_PER_MINUTE);
                        // 让这条警告通过
                        event.setFullErrorMessage("⚠️ 钉钉通知已达本分钟上限（" + MAX_PER_MINUTE + "条），请检查日志");
                        LIMIT_WARNING_SENT = true;
                        CURRENT_COUNT.incrementAndGet();
                        return false;
                    }
                }
            }
            return true;  // 过滤掉
        }

        // 未达到限制，计数并通过
        CURRENT_COUNT.incrementAndGet();
        return false;
    }

    @Override
    public int getOrder() {
        return 4;  // 第四优先级，最后检查
    }

    @Override
    public String getName() {
        return "RateLimitFilter";
    }
}

